home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / umich / falcon / programm.ing / falclib5.lzh / ROUTS / GORAUD.S < prev    next >
Text File  |  1994-08-11  |  6KB  |  296 lines

  1. *
  2. * GORAUD.S
  3. *
  4. *    @goraud
  5. *
  6. *    Draw a goraud shaded polygon in true colour.
  7. *    There's no clipping so don't draw too large polygons.
  8. *
  9. * In    a1.l=screenadr
  10. *    a2.l=adr to colourtable
  11. *    new_crds=following table: [x,y,i]*nbr_of_points
  12. *    d6.w=nbr. of points
  13. *    xres equ horizontal resolution
  14. *    (destroys a lot)
  15. *
  16. *    The colourtable consists of 32 words, each a true colour value.
  17. *     word nr 0 is the darkest and word nr 31 the brightest. This is
  18. *     followed by 16 empty words.
  19. *    Supplied colours: g_lightred, g_green, g_brown, g_white
  20. *    new_crds is a table that consist of a pair of coordinates followed
  21. *     by a brightnes factor. The brightnes factor is a number between 0
  22. *     and #$7fff.
  23. *
  24. * ex.     xres equ 384        overscaned lowres screen
  25. *     bsr @initgoraud    call once only
  26. *
  27. *     move.l scradr,a1    screenaddress
  28. *     move.l #g_red,a2    I want a red poly
  29. *     moveq #4,d6        four points
  30. *     bsr @goraud        draw it
  31. *
  32. *     new_crds dc.w 10,10,0        a dark point
  33. *                dc.w 200,20,$7fff    a bright point
  34. *          dc.w 140,140,$7fff/2
  35. *          dc.w 25,50,$7fff/4
  36. *    
  37. *
  38. *    @initgoraud
  39. *     This subroutine must be called once before using '@goraud'.
  40. *
  41.  
  42.  
  43.  
  44. @goraud
  45.         lea    offsets,a0
  46.         move.l    a1,workscr2354
  47.         move.l    a2,colouradr2354
  48.         bsr    GDraw_Poly
  49.         rts
  50.  
  51.         
  52. colouradr2354    ds.l    1
  53. offsets        dc.w    0,6,12,18,24,30,36,42,48,54,60,66,72,78,84,90,96,100
  54.  
  55.  
  56. ;-----------------------------------------------------------------------;
  57. ;                 Gouraud Shaded Polygon Routine.            ;
  58. ; A0 -> D6 coords (offsets into 'new_crds' in form X,Y,INTENSITY CONST) ;
  59. ;-----------------------------------------------------------------------;
  60.  
  61. GDraw_Poly    LEA trans_crds,A1 
  62.         LEA new_crds,A6
  63.         MOVE D6,D0
  64.         ADD D6,D6
  65.         ADD D0,D6
  66.         ADD D6,D6        6*d6
  67.         MOVE.L A1,A5
  68.         ADDA.W D6,A5
  69.         MOVE.L A5,A2
  70.         ADDA.W D6,A2
  71. Init_coords    SUBQ #2,D0
  72.         MOVE.W (A0)+,D7
  73.         MOVE.W 4(A6,D7),D5
  74.         MOVE.L (A6,D7),D7
  75.         MOVE D7,D2
  76.         MOVE.L A5,A4
  77.         MOVE.L D7,(A1)+        ; dup first coord
  78.         MOVE.W D5,(A1)+
  79.         MOVE.L D7,(A2)+
  80.         MOVE.W D5,(A2)+
  81.         MOVE.L D7,(A5)+
  82.         MOVE.W D5,(A5)+
  83. .coord_lp    MOVE.W (A0)+,D3
  84.         MOVE.W 4(A6,D3),D5
  85.         MOVE.L (A6,D3),D3
  86.         CMP D2,D3
  87.         BGE.S .not_top
  88.         MOVE D3,D2
  89.         MOVE.L A5,A4
  90. .not_top    CMP D3,D7
  91.         BGE.S .not_bot
  92.         MOVE D3,D7    
  93. .not_bot    MOVE.L D3,(A1)+        ; dup for rest
  94.         MOVE.W D5,(A1)+
  95.         MOVE.L D3,(A2)+
  96.         MOVE.W D5,(A2)+
  97.         MOVE.L D3,(A5)+
  98.         MOVE.W D5,(A5)+
  99.         DBF D0,.coord_lp
  100.         MOVE.L A0,USP
  101.         MOVE.L A4,A5
  102.         SUB D2,D7        ;d2 - lowest y  d7 - greatest y
  103.         BEQ polydone
  104.         MOVE D2,-(SP)
  105.         MOVE D7,-(SP)
  106.  
  107. CALCS        LEA grad_table+640(PC),A0
  108. ; Calc x's down left side of poly
  109. Do_left        LEA LEFTJMP(PC),A2
  110.         LEA x1s(PC),A3
  111. Left_lp     SUBQ #6,A4
  112.         MOVEM.W (A4),D1-D2        ;x1,y1
  113.         MOVEM.W 4(A4),D0/D3-D5        ;I2,x2,y2,I1
  114.         SUB D4,D2            ;dy
  115.         SUB D3,D1            ;dx
  116.         SUB D2,D7            ;remaining lines-dy
  117.         SUB D5,D0            ;DI
  118.         EXT.L D0
  119.         DIVS D2,D0    
  120.         ADD.W D2,D2        
  121.         MULS (A0,D2),D1
  122.         ADD.L D1,D1
  123.         MOVE.W D1,D4            ; frac part
  124.         SWAP D1                ; whole part
  125.         MOVE.W D2,D6
  126.         ADD D2,D2
  127.         ADD D2,D2
  128.         ADD D6,D2            ; *10
  129.         NEG D2
  130.         CLR.W D6
  131.         JMP (A2,D2)
  132.         REPT 200
  133.         MOVE.W D3,(A3)+
  134.         ADD.W D4,D6
  135.         ADDX.W D1,D3
  136.         MOVE.W D5,(A3)+
  137.         ADD.W D0,D5
  138.         ENDR
  139. LEFTJMP        TST D7
  140.         BGT Left_lp
  141.  
  142. ; Calc x's down right side of poly
  143.  
  144. Do_right    MOVE.W (SP),D7
  145.         LEA RIGHTJMP(PC),A2
  146.         LEA x2s(PC),A3
  147. Right_lp    MOVEM.W (A5)+,D1-D2/D5        ;x1,y1,I2
  148.         MOVEM.W (A5),D3-D4/D6        ;x2,y2,I1
  149.         SUB D2,D4            ;dy
  150.         SUB D1,D3            ;dx
  151.         SUB D4,D7            ;remaining lines-dy
  152.         SUB D5,D6            ;DI
  153.         EXT.L D6
  154.         DIVS D4,D6    
  155.         ADD.W D4,D4            
  156.         MULS (A0,D4),D3
  157.         ADD.L D3,D3
  158.         MOVE.W D3,D2            ; frac part    
  159.         SWAP D3                ; whole part
  160.         MOVE.W D4,D0
  161.         ADD D4,D4
  162.         ADD D4,D4
  163.         ADD D0,D4            ; *10
  164.         NEG D4
  165.         CLR.W D0
  166.         JMP (A2,D4)
  167.         REPT 200
  168.         MOVE.W D1,(A3)+
  169.         ADD.W D2,D0
  170.         ADDX.W D3,D1
  171.         MOVE.W D5,(A3)+
  172.         ADD.W D6,D5
  173.         ENDR
  174. RIGHTJMP    TST D7
  175.         BGT Right_lp
  176.  
  177. ; Now draw on screen
  178.  
  179. .gofordraw     MOVE (SP)+,D7        ; DY
  180.         MOVE (SP)+,D0        ; MIN Y
  181.         SUBQ #1,D7
  182.         move.l    colouradr2354,a5
  183.         MOVE.L workscr2354(PC),A6
  184.         MULU #xres*2,D0 
  185.         ADDA.L D0,A6 
  186.         LEA x1s(PC),A1
  187.         LEA x2s(PC),A2
  188.         MOVEQ #16-6,D3
  189.         MOVE.W #xres*2,D4
  190.         MOVEQ #0,D5
  191. Gdraw_lp        MOVE.W (A1)+,D0        ; x1
  192.         MOVE.W (A2)+,D6        ; x2
  193.         MOVE.W (A1)+,D1         ; Intensity 1
  194.         MOVE.W (A2)+,D2        ; Intensity 2
  195.         EXT.L D1
  196.         EXT.L D2
  197.         LEA (A6,D0.W*2),A0
  198.         SUB.W D0,D6 
  199.         BLE DS2 
  200.         SUB.L D1,D2         
  201.         EXT.L D6
  202.         SWAP D2
  203.         DIVS.L D6,D2
  204.         ASR.L D3,d2
  205.         ASL.L #6,D1
  206.         SWAP D1
  207.         SWAP D2
  208.         MOVEQ #31,D0
  209.         AND.W D6,D0
  210.         LSR.W #5,D6
  211.         MOVE D5,CCR
  212.         JMP ([jmptab,D0.W*4])
  213. Glp        
  214.         REPT 32
  215.         MOVE.W (A5,D1*2),(A0)+
  216.         ADDX.L D2,D1
  217.         ENDR
  218. g_jmp        DBF D6,Glp
  219. DS2          ADD.W D4,A6
  220.         DBF D7,Gdraw_lp
  221.  
  222. polydone    RTS 
  223.  
  224.  
  225. i        SET 0
  226. jmptab        
  227.         REPT 32
  228.         DC.L g_jmp+i
  229. i        SET i-6
  230.         ENDR 
  231.         DS.W 16
  232.  
  233. ; Create Multplication gradient table for poly edges
  234.  
  235. @initgoraud    LEA grad_table(PC),A0
  236.         MOVE #-320,D0
  237. .lp1        MOVE.L #32768,D1
  238.         DIVS D0,D1
  239.         MOVE.W D1,(A0)+
  240.         ADDQ #1,D0
  241.         CMP #-1,D0
  242.         BNE.S .lp1
  243.         MOVE.W #-32768,(A0)+
  244.         MOVE.W #0,(A0)+
  245.         MOVE.W #32767,(A0)+
  246.         MOVEQ #2,D0
  247. .lp2        MOVE.L #32768,D1
  248.         DIVS D0,D1
  249.         MOVE.W D1,(A0)+
  250.         ADDQ #1,D0
  251.         CMP #321,D0
  252.         BNE.S .lp2
  253.         RTS        
  254.  
  255. grad_table    ds.w 642
  256.  
  257. x1s        DS.L 201
  258. x2s        DS.L 201
  259.  
  260. trans_crds        DS.W 200
  261.  
  262. workscr2354    ds.l    1
  263.  
  264.  
  265. g_lightred
  266. i        set    0
  267.         rept    32
  268.         dc.w    (31*32*64)+(i*64)+(i)
  269. i        set    i+1
  270.         endr
  271.         ds.w    16
  272.  
  273. g_green
  274. i        set    0
  275.         rept    32
  276.         dc.w    (1*32*64)+(i*64)+(1)
  277. i        set    i+1
  278.         endr
  279.         ds.w    16
  280.  
  281. g_white
  282. i        set    0
  283.         rept    32
  284.         dc.w    (i*32*64)+(i*64)+(i)
  285. i        set    i+1
  286.         endr
  287.         ds.w    16
  288.  
  289. g_brown
  290. i        set    0
  291.         rept    32
  292.         dc.w    (i*32*64)+((i/2)*64)+(2)
  293. i        set    i+1
  294.         endr
  295.         ds.w    16
  296.